#ifndef MAINWIDGET_H
#define MAINWIDGET_H

////////////////////////////////////////////
/// main widget, init all widget here
////////////////////////////////////////////
#include <QLineEdit>
#include <QPushButton>
#include <QWidget>
#include "../Model/DataCenter.h"
#include "Custom/CircleButton.h"
#include "MessageShowArea.h"
#include "SessionFriendApplyArea.h"

QT_BEGIN_NAMESPACE
namespace Ui
{
class MainWidget;
}
QT_END_NAMESPACE

class MainWidget : public QWidget
{
    Q_OBJECT

public:
    static MainWidget* get_instance();
    /* 网络相关的函数, 需要公开被其它类使用的 */
    void load_recent_messages(const QString& chat_session_id);
    void handle_friend_item_active(const QString& user_id);
public:
    /* 一部分 get 和 set 方法 */
    MessageShowArea* get_message_show_area();
private:
    static MainWidget* instance;
    MainWidget(QWidget* parent = nullptr);
    ~MainWidget();

    /* 描述当前激活的页面 */
    enum ActivePage {
        SESSION_PAGE,  // 会话页面
        FRIEND_PAGE,   // 好友页面
        APPLY_PAGE     // 好友申请页面
    };

    /* 按钮所需要使用的资源 */
    struct PageButtonInfo {
        QPushButton* button;         // 按钮对象
        QString      active_icon;    // 激活时使用的图片
        QString      inactive_icon;  // 不激活时使用的图片
    };

    /* 当按钮被激活和不被激活时的QStyleSheet语句 */
    const QString ACTIVE_STYLE =
        "QPushButton {background-color: #DCDCDC; border: none;}"
        "QPushButton:hover{background-color:#DCDCDC;}"
        "QPushButton:pressed{background-color:#D7D7D7;}";

    const QString INACTIVE_STYLE =
        "QPushButton {background-color: transparent; border: none;}"
        "QPushButton:hover{background-color:#DCDCDC;}"
        "QPushButton:pressed{background-color:#D7D7D7;}";

    /* 界面初始化函数 */
    void init_ui();
    void init_main_window();
    void init_left_window();
    void init_mid_window();
    void init_right_window();
    /* 连接信号槽 */
    void connect_signal_slots();
    void connect_signal_for_web();
    void switch_to_session_page();
    void switch_to_friend_page();
    void switch_to_friend_apply_page();
    void switch_to_page(ActivePage page);
    void handle_clicked_more_btn();
    /* 其它工具函数 */
    void set_side_button(QPushButton* btn, const QString& icon, int size = 45);
    /* 网络相关函数 */
    void load_friend_list();
    void update_friend_list();
    void load_chat_session_list();
    void update_chat_session_list();
    void load_friend_apply_list();
    void update_friend_apply_list();
    void update_recent_messages(const QString& chat_session_id);
    /* 窗口 */
    QWidget*                left_window;
    QWidget*                mid_window;
    QWidget*                right_window;
    SessionFriendApplyArea* s_f_a_area;         // 会话好友申请区域
    MessageShowArea*        message_show_area;  // 消息展示区域
    /* 按钮 */
    CircleButton*                    user_avatar;                 // 用户头像
    QPushButton*                     session_btn;                 // 会话按钮
    QPushButton*                     friend_btn;                  // 好友按钮
    QPushButton*                     friend_aply_btn;             // 好友申请按钮
    QPushButton*                     add_friend_btn;              // 添加好友按钮
    QPushButton*                     more_btn;                    // 三个点, 更多按钮
    QLineEdit*                       line_edit;                   // 中间窗口的输入框
    ActivePage                       active_page = SESSION_PAGE;  // 当前激活的页面
    QMap<ActivePage, PageButtonInfo> page_button_map;             // 将ActivePage与PageButtonInfo关联起来
    Ui::MainWidget*                  ui;
    model::DataCenter*               data_center;                 // 数据中心, 存放所有数据
    QLabel*                          title;                       // 右侧区域的标题, 如果是群聊, 就是群名称, 如果是单聊, 就是好友名称
};  // end MainWidget
#endif  // MAINWIDGET_H
